import store from '@/store'
import router from '@/router'

// to 到哪里去，跳转的目标路由对象
// from 哪里来的，当前路由对象（）跳转之前的对象
// next 放行函数
router.beforeEach(async(to, from, next) => {
  if (store.state.user.token) {
    // 在有token的情况下不允许回退到登录页
    if (to.path === '/login') {
      next('/')
    } else {
      if (!store.state.user.userInfo.id) {
        await store.dispatch('user/getUserInfo')
        // 为了获取menus数组，必须要写在获取用户信息之后
        const routes = await store.dispatch('permission/filterRoutes', store.getters.menus)
        
        // 把筛选出来的具有权限的动态路由数组重新添加回路由规则中
        // 添加一条新路由规则。如果该路由规则有 name，并且已经存在一个与之相同的名字，则会覆盖它。
        // 解决跳转404问题
        router.addRoutes([...routes, { path: '*', redirect: '/404', hidden: true }])
        // 解决跳转出空白问题，重新跳转到当前动态路由页面
        next(to.path)
      }
      next()
    }
  } else {
    // 白名单
    const awaitArr = ['/login', '/404', '/register']
    if (awaitArr.indexOf(to.path) !== -1) {
      next()
    } else {
      next('/login')
    }
  }
})
